#ifndef _CLIENT_H_
#define _CLIENT_H_

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "../lvgl/lvgl.h"
#include "../lvgl/demos/lv_demos.h"
#include "../lv_drivers/display/fbdev.h"
#include "../lv_drivers/indev/evdev.h"
#include "../inc/chat_interface.h"

#define EXIT_MASK "exit"             // 退出
#define PRIVATE_CHAT "P_Chat"        // 私聊
#define WE_CHAT "W_Chat"             // 群聊
#define SHOW_WEATHER "S_Weat"        // 天气
#define SHOW_ONLINE_CLI "ONLINE_Cli" // 显示在线
#define TIME_MASK "time"             // 时间

#define IP_LEN 16         // IP地址最大长度
#define MSG_MAX_LEN 1024  // 消息最大长度
#define MAX_MESSAGES 1000 // 消息队列最大长度

extern int mode;         // 模式选择
extern int connect_flag; // 连接状态

// 其他在线客户端IP列表
typedef struct IpNode
{
    char ip[IP_LEN]; // 存储IP地址
    struct IpNode *next;
} IpNode, *IpList;

// 聊天窗口控件
lv_obj_t *online_clients_list;               // 聊天列表控件
lv_obj_t *kb;                                // 键盘
lv_obj_t *text_label;                        // 文本标签
lv_obj_t *text_ta;                           // 文本区域
lv_obj_t *close_btn;                         // 关闭按钮
lv_obj_t *group_label;                       // 群聊标题
lv_obj_t *private_label;                     // 私聊标题
lv_obj_t *private_chat_labels[MAX_MESSAGES]; // 私聊消息
lv_obj_t *group_chat_labels[MAX_MESSAGES];   // 群聊消息
lv_obj_t *private_chat_canvas;               // 私聊画布
lv_obj_t *group_chat_canvas;                 // 群聊画布

int EXIT_SEND;          // 信息发送标志
int EXIT_CLIENT;        // 程序退出标志
int chat_mode;          // 聊天模式 1 群聊，2 私聊
char target_ip[IP_LEN]; // 目标IP


const char *input_text; // 输入文本


/************** 函数声明 ****************/
void *Send(void *arg);
void *client(void *arg);
void *Recv_server(void *arg);
bool GroupChat_Task(int *cli_fd);
bool PrivateChat_Task(int *cli_fd);

IpList InitIpList();
void AddIpToIpList(IpList *head, const char *ip);
void PrintIpList(IpList head);
void FreeIpList(IpList *head);
IpNode *FindIpInList(IpList head, const char *ip);

void show_time(char *time_msg);
void weather_label(char *weather_msg);
void time_update_cb(lv_timer_t *timer);

void update_online_clients(IpList ipList);
void online_client_event_cb(lv_event_t *e);

void ta_event_cb(lv_event_t *e);
void chat_label_init();
void chat_window();
void close_btn_cb(lv_event_t *e);
void hide_chat_window();
void show_private_msg(const char *info);
void show_group_msg(const char *info);

#endif